package java8;

import java.util.function.Function;

public class FunctionSample {

    public static void main(String[] args) {
        // Function<Input, Output>: Input类型入参, 须返回Output类型的值
        Function<String, Integer> strLenFunction = String::length;
        // 输出: 5
        System.out.println(strLenFunction.apply("Hello"));

        // Function.identity(): 返回和入参同类型的值（入参即返回）
        Function<String, String> idenFunction = Function.identity();
        // 输出: Hello
        System.out.println(idenFunction.apply("Hello"));

        Function<Integer, Boolean> zeroLenFunction = i -> i == 0;
        // x1.andThen(x2): 先执行 x1.apply(), 将x1执行的结果作为x2的输入, 执行 x2.apply(), x2执行的结果就是函数最终返回的值
        // Function<I, V> = Function<I, O>.andThen(Function<O, V>)
        Function<String, Boolean> checkEmptyFunction = strLenFunction.andThen(zeroLenFunction);
        // 输出: true
        System.out.println(checkEmptyFunction.apply(""));

        // compose 和 andThen 的执行顺序相反
        // x1.compose(x2): 先执行 x2.apply(), 将x2执行的结果作为x1的输入, 执行 x1.apply(), x1执行的结果就是函数最终返回的值
        // Function<V, O> = Function<I, O>.compose(Function<V, I>)
        checkEmptyFunction = zeroLenFunction.compose(strLenFunction);
        // 输出: true
        System.out.println(checkEmptyFunction.apply(""));

        // IntFunction
        // IntToDoubleFunction
        // IntToLongFunction
        // LongFunction
        // LongToDoubleFunction
        // LongToIntFunction
        // DoubleFunction
        // DoubleToIntFunction
        // DoubleToLongFunction
        // BiFunction
        // ToIntBiFunction
        // ToIntFunction
        // ToLongBiFunction
        // ToLongFunction
        // ToDoubleBiFunction
        // ToDoubleFunction
    }

}